<!doctype html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport"
        content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>JS let&const</title>
</head>
<body>
  <p>let&const</p>
  <ul>
    <li>为了解决JS变量提升的隐患，将JS变量限定在某一个指定的作用域范围内，引入let定义变量</li>
    <li>对"先使用后声明"的let变量，JS将会解析编译不通过，将会抛出Uncaught ReferenceError，也不会执行对应的上下文</li>
    <li>在函数内部的let变量仍然遵循"先声明后使用"原则，如果当前函数体中为声明，则往函数外向上查找(找到则使用，未找到则报错)</li>
    <li>在函数参数中仍然遵循"先声明后使用"原则, 参数也是依次"从左至右，从上至下"原则声明和赋值</li>
  </ul>
  <script>
    // console.log(user); // 抛异常
    let user = 'Miracle';
    function getName() {
      // console.log(user); // 抛异常
      let user = 'Miracle';
    }
    getName();
    // function run(a = b, b = 1) {} // 抛异常
    function run(a = 1, b = a) {} // 正常执行
    run()
  </script>
</body>
</html>